# Get file paths
BEPA_file <- "/Volumes/lab_kingsley/ambenj/myosin_dups/analysis/nahr_analysis/BEPA-dup_divergent_sites.txt"
BLAU_file <- "/Volumes/lab_kingsley/ambenj/myosin_dups/analysis/nahr_analysis/BLAU-dup_divergent_sites.txt"
CMCB_file <- "/Volumes/lab_kingsley/ambenj/myosin_dups/analysis/nahr_analysis/CMCB-dup_divergent_sites.txt"
DNSE_file <- "/Volumes/lab_kingsley/ambenj/myosin_dups/analysis/nahr_analysis/DNSE-dup_divergent_sites.txt"
ECHO_file <- "/Volumes/lab_kingsley/ambenj/myosin_dups/analysis/nahr_analysis/ECHO-dup_divergent_sites.txt"
JADE_file <- "/Volumes/lab_kingsley/ambenj/myosin_dups/analysis/nahr_analysis/JADE-dup_divergent_sites.txt"
KFSY_file <- "/Volumes/lab_kingsley/ambenj/myosin_dups/analysis/nahr_analysis/KFSY-dup_divergent_sites.txt"
# Read in BEPA divergent sites file
BEPA_df <- read_tsv(BEPA_file) %>% 
  mutate(dup1 = "dup1",
         dup2 = case_when(`BEPA-dup2` == `BEPA-dup1`~ "dup1",
                          `BEPA-dup2` == `BEPA-dup3`~ "dup3",
                          TRUE ~ "dup2_unique"),
         dup3 = case_when(`BEPA-dup3` == `BEPA-dup1`~ "dup1",
                          TRUE ~ "dup3")) %>% 
  filter(dup2 != "dup2_unique") %>% 
  pivot_longer(starts_with("dup"), names_to = "dup", values_to = "variant_type")
BEPA_df
# Read in CMCB divergent sites file
CMCB_df <- read_tsv(CMCB_file) %>% 
  mutate(dup1 = "dup1",
         dup2 = case_when(`CMCB-dup2` == `CMCB-dup1`~ "dup1",
                          `CMCB-dup2` == `CMCB-dup3`~ "dup3",
                          TRUE ~ "dup2_unique"),
         dup3 = case_when(`CMCB-dup3` == `CMCB-dup1`~ "dup1",
                          TRUE ~ "dup3")) %>% 
  filter(dup2 != "dup2_unique") %>% 
  pivot_longer(starts_with("dup"), names_to = "dup", values_to = "variant_type")
CMCB_df
# Read in DNSE divergent sites file
DNSE_df <- read_tsv(DNSE_file) %>% 
  mutate(dup1 = "dup1",
         dup2 = case_when(`DNSE-dup2` == `DNSE-dup1`~ "dup1",
                          `DNSE-dup2` == `DNSE-dup3`~ "dup3",
                          TRUE ~ "dup2_unique"),
         dup3 = case_when(`DNSE-dup3` == `DNSE-dup1`~ "dup1",
                          TRUE ~ "dup3")) %>% 
  filter(dup2 != "dup2_unique") %>% 
  pivot_longer(starts_with("dup"), names_to = "dup", values_to = "variant_type")
DNSE_df
# Read in ECHO divergent sites file
ECHO_df <- read_tsv(ECHO_file) %>% 
  mutate(dup1 = "dup1",
         dup2 = case_when(`ECHO-dup2` == `ECHO-dup1`~ "dup1",
                          `ECHO-dup2` == `ECHO-dup3`~ "dup3",
                          TRUE ~ "dup2_unique"),
         dup3 = case_when(`ECHO-dup3` == `ECHO-dup1`~ "dup1",
                          TRUE ~ "dup3")) %>% 
  filter(dup2 != "dup2_unique") %>% 
  pivot_longer(starts_with("dup"), names_to = "dup", values_to = "variant_type")
ECHO_df
# Read in JADE divergent sites file
JADE_df <- read_tsv(JADE_file) %>% 
  mutate(dup1 = "dup1",
         dup2 = case_when(`JADE-dup2` == `JADE-dup1`~ "dup1",
                          `JADE-dup2` == `JADE-dup3`~ "dup3",
                          TRUE ~ "dup2_unique"),
         dup3 = case_when(`JADE-dup3` == `JADE-dup1`~ "dup1",
                          TRUE ~ "dup3")) %>% 
  filter(dup2 != "dup2_unique") %>% 
  pivot_longer(starts_with("dup"), names_to = "dup", values_to = "variant_type")
JADE_df
# Read in KFSY divergent sites file
KFSY_df <- read_tsv(KFSY_file) %>% 
  mutate(dup1 = "dup1",
         dup2 = case_when(`KFSY-dup2` == `KFSY-dup1`~ "dup1",
                          `KFSY-dup2` == `KFSY-dup3`~ "dup3",
                          TRUE ~ "dup2_unique"),
         dup3 = case_when(`KFSY-dup3` == `KFSY-dup1`~ "dup1",
                          TRUE ~ "dup3")) %>% 
  filter(dup2 != "dup2_unique") %>% 
  pivot_longer(starts_with("dup"), names_to = "dup", values_to = "variant_type")
KFSY_df
# Make function to generate heatmap plot
div_pos_plot3 <- function(df){
  p<- df %>%
    ggplot(aes(x = factor(Position), y = reorder(dup, desc(dup)), fill = variant_type)) +
    geom_tile(color="white") +
    scale_fill_manual(values = c("#00674b", "#00d399")) + 
    scale_x_discrete(position = "top") +
    theme_minimal(base_size = 7) +
    theme(axis.title.x = element_blank(),
#      axis.title.y = element_blank(),
    axis.text.x = element_text(angle = 90, hjust = 0, vjust = 0.5),
    panel.grid = element_blank(),
    plot.margin = margin(0, 0, 0, 0),
    legend.position="none"
  )
  return(p)
}
# Make function to generate heatmap plot when there are 4 duplication copies
div_pos_plot4 <- function(df){
  p<- df %>%
    ggplot(aes(x = factor(Position), y = reorder(dup, desc(dup)), fill = variant_type)) +
    geom_tile(color="white") +
    scale_fill_manual(values = c("#00674b", "#00d399","grey")) + 
    scale_x_discrete(position = "top") +
    theme_minimal(base_size = 7) +
    theme(axis.title.x = element_blank(),
#      axis.title.y = element_blank(),
    axis.text.x = element_text(angle = 90, hjust = 0, vjust = 0.5),
    panel.grid = element_blank(),
    plot.margin = margin(0, 0, 0, 0),
    legend.position="none"
  )
  return(p)
}

# Make CMCB plot
CMCB_plot <- div_pos_plot3(CMCB_df) + ylab("CMCB")
CMCB_plot

# Make JADE plot
JADE_plot <- div_pos_plot3(JADE_df) + ylab("JADE")
JADE_plot

# Make BLAU plot
BLAU_plot <- div_pos_plot4(BLAU_df) + ylab("BLAU")
BLAU_plot

Analysis using same position numbers for all alignments

# Read in BLAU divergent sites file
all_nogaps_df <- read_tsv(all_nogaps_file) %>% 
    pivot_longer(cols = -Position, names_to = c("sample", "dup"),names_sep = "-") %>% 
    pivot_wider(names_from = dup, values_from = value) %>% 
  mutate(dup1_type = case_when(!is.na(dup1) ~ "dup1"),
         dup2_type = case_when(dup2 == dup1 ~ "dup1",
                               sample != "BLAU" & dup2 == dup3 ~ "dupL", 
                               sample == "BLAU" & dup2 == dup4 ~ "dupL",
                               sample == "BLAU" & dup2 == dup3 ~ "other",
                               is.na(dup2) ~ "other"),
         dup3_type = case_when(dup3 == dup1 ~ "dup1",
                               dup3 == dup4 ~ "dupL",
                               sample == "BLAU" & dup3 == dup2 ~ "other",
                               !is.na(dup3) ~ "dupL"),
         dup4_type = case_when(dup4 == dup1 ~ "dup1",
                               !is.na(dup4) ~ "dupL")) %>% 
  pivot_longer(ends_with("type"), names_to = "dup", values_to = "variant_type") %>% 
  mutate(dup = str_remove(dup, "_type"),
         sample = fct_relevel(sample, levels = c("BEPA", "ECHO", "JADE", "CMCB", "DNSE", "KFSY", "BLAU"))) %>% 
  filter(!is.na(variant_type), !(sample == "BLAU" & dup1==dup2 & dup1==dup3 & dup1==dup4), !(sample != "BLAU" & dup1==dup2 & dup1==dup3))
Error in `mutate()`:
ℹ In argument: `sample = fct_relevel(...)`.
Caused by error in `fct_relevel()`:
! Arguments in `...` must be passed by position, not name.
✖ Problematic argument:
• levels = c("BEPA", "ECHO", "JADE", "CMCB", "DNSE", "KFSY", "BLAU")
Run `]8;;x-r-run:rlang::last_trace()rlang::last_trace()]8;;` to see where the error occurred.
# Make function to generate heatmap plot when there are 4 duplication copies
div_pos_plot_all <- function(df){
  p<- df %>%
    ggplot(aes(x = factor(Position), y = reorder(dup, desc(dup)), fill = variant_type)) +
    geom_tile(color="white") +
    scale_fill_manual(values = c("#00674b", "#00d399","grey")) + 
    scale_x_discrete(position = "top") +
    theme_minimal(base_size = 6.5) +
    theme(axis.title.x = element_blank(),
#      axis.title.y = element_blank(),
    axis.text.x = element_text(angle = 90, hjust = 0, vjust = 0.5),
    panel.grid = element_blank(),
    plot.margin = margin(0, 0, 0, 0),
    legend.position="none"
  )
  return(p)
}

ggsave("/Volumes/lab_kingsley/ambenj/myosin_dups/analysis/nahr_analysis/shared_plot_allSamps_allPos_figure.pdf", width = 6.5, height = 2.5, units = "in")
# Since CMCB, DNSE, KFSY, and JADE results are the same, filter down to one representative
div_pos_plot_all(filter(all_nogaps_df, sample %in% c("BEPA", "ECHO", "CMCB", "BLAU"), (sample == "BLAU" & dup1!=dup4)| (sample != "BLAU" & dup1!=dup3))) + 
  facet_grid(rows = vars(sample), scale="free_y", space="free_y", switch = "y") +
  theme(strip.placement = "outside", axis.title.y = element_blank())

# Plot just BEPA with BEPA-divergent positions only, but position numbers are comparable to others
BEPA_shared_plot <- div_pos_plot_all(filter(all_nogaps_df, sample == "BEPA", dup1!=dup3)) + 
  facet_grid(rows = vars(sample), scales="free", space="free", switch = "y") +
  theme(strip.placement = "outside", axis.title.y = element_blank())

BEPA_shared_plot

# Plot just CMCB with CMCB-divergent positions only, but position numbers are comparable to others
CMCB_shared_plot <- div_pos_plot_all(filter(all_nogaps_df, sample == "CMCB", dup1!=dup3)) + 
  facet_grid(rows = vars(sample), scales="free", space="free", switch = "y") +
  theme(strip.placement = "outside", axis.title.y = element_blank())

CMCB_shared_plot

# Plot just DNSE with DNSE-divergent positions only, but position numbers are comparable to others
DNSE_shared_plot <- div_pos_plot_all(filter(all_nogaps_df, sample == "DNSE", dup1!=dup3)) + 
  facet_grid(rows = vars(sample), scales="free", space="free", switch = "y") +
  theme(strip.placement = "outside", axis.title.y = element_blank())

DNSE_shared_plot

# Plot just ECHO with ECHO-divergent positions only, but position numbers are comparable to others
ECHO_shared_plot <- div_pos_plot_all(filter(all_nogaps_df, sample == "ECHO", dup1!=dup3)) + 
  facet_grid(rows = vars(sample), scales="free", space="free", switch = "y") +
  theme(strip.placement = "outside", axis.title.y = element_blank())

ECHO_shared_plot

# Plot just JADE with JADE-divergent positions only, but position numbers are comparable to others
JADE_shared_plot <- div_pos_plot_all(filter(all_nogaps_df, sample == "JADE", dup1!=dup3)) + 
  facet_grid(rows = vars(sample), scales="free", space="free", switch = "y") +
  theme(strip.placement = "outside", axis.title.y = element_blank())

JADE_shared_plot

# Plot just KFSY with KFSY-divergent positions only, but position numbers are comparable to others
KFSY_shared_plot <- div_pos_plot_all(filter(all_nogaps_df, sample == "KFSY", dup1!=dup3)) + 
  facet_grid(rows = vars(sample), scales="free", space="free", switch = "y") +
  theme(strip.placement = "outside", axis.title.y = element_blank())

KFSY_shared_plot

# Plot just BLAU with BLAU-divergent positions only, but position numbers are comparable to others
BLAU_shared_plot <- div_pos_plot_all(filter(all_nogaps_df, sample == "BLAU", dup1!=dup4)) + 
  facet_grid(rows = vars(sample), scales="free", space="free", switch = "y") +
  theme(strip.placement = "outside", axis.title.y = element_blank())

BLAU_shared_plot

shared_plot_subset <- plot_grid(BEPA_shared_plot, ECHO_shared_plot, CMCB_shared_plot, BLAU_shared_plot, ncol = 1)
shared_plot_subset

ggsave("/Volumes/lab_kingsley/ambenj/myosin_dups/analysis/nahr_analysis/shared_plot_subset_figure.pdf", width = 6.5, height = 2.2, units = "in")
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShjb3dwbG90KQpgYGAKCmBgYHtyfQojIEdldCBmaWxlIHBhdGhzCkJFUEFfZmlsZSA8LSAiL1ZvbHVtZXMvbGFiX2tpbmdzbGV5L2FtYmVuai9teW9zaW5fZHVwcy9hbmFseXNpcy9uYWhyX2FuYWx5c2lzL0JFUEEtZHVwX2RpdmVyZ2VudF9zaXRlcy50eHQiCkJMQVVfZmlsZSA8LSAiL1ZvbHVtZXMvbGFiX2tpbmdzbGV5L2FtYmVuai9teW9zaW5fZHVwcy9hbmFseXNpcy9uYWhyX2FuYWx5c2lzL0JMQVUtZHVwX2RpdmVyZ2VudF9zaXRlcy50eHQiCkNNQ0JfZmlsZSA8LSAiL1ZvbHVtZXMvbGFiX2tpbmdzbGV5L2FtYmVuai9teW9zaW5fZHVwcy9hbmFseXNpcy9uYWhyX2FuYWx5c2lzL0NNQ0ItZHVwX2RpdmVyZ2VudF9zaXRlcy50eHQiCkROU0VfZmlsZSA8LSAiL1ZvbHVtZXMvbGFiX2tpbmdzbGV5L2FtYmVuai9teW9zaW5fZHVwcy9hbmFseXNpcy9uYWhyX2FuYWx5c2lzL0ROU0UtZHVwX2RpdmVyZ2VudF9zaXRlcy50eHQiCkVDSE9fZmlsZSA8LSAiL1ZvbHVtZXMvbGFiX2tpbmdzbGV5L2FtYmVuai9teW9zaW5fZHVwcy9hbmFseXNpcy9uYWhyX2FuYWx5c2lzL0VDSE8tZHVwX2RpdmVyZ2VudF9zaXRlcy50eHQiCkpBREVfZmlsZSA8LSAiL1ZvbHVtZXMvbGFiX2tpbmdzbGV5L2FtYmVuai9teW9zaW5fZHVwcy9hbmFseXNpcy9uYWhyX2FuYWx5c2lzL0pBREUtZHVwX2RpdmVyZ2VudF9zaXRlcy50eHQiCktGU1lfZmlsZSA8LSAiL1ZvbHVtZXMvbGFiX2tpbmdzbGV5L2FtYmVuai9teW9zaW5fZHVwcy9hbmFseXNpcy9uYWhyX2FuYWx5c2lzL0tGU1ktZHVwX2RpdmVyZ2VudF9zaXRlcy50eHQiCmBgYAoKYGBge3J9CiMgUmVhZCBpbiBCRVBBIGRpdmVyZ2VudCBzaXRlcyBmaWxlCkJFUEFfZGYgPC0gcmVhZF90c3YoQkVQQV9maWxlKSAlPiUgCiAgbXV0YXRlKGR1cDEgPSAiZHVwMSIsCiAgICAgICAgIGR1cDIgPSBjYXNlX3doZW4oYEJFUEEtZHVwMmAgPT0gYEJFUEEtZHVwMWB+ICJkdXAxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBgQkVQQS1kdXAyYCA9PSBgQkVQQS1kdXAzYH4gImR1cDMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiZHVwMl91bmlxdWUiKSwKICAgICAgICAgZHVwMyA9IGNhc2Vfd2hlbihgQkVQQS1kdXAzYCA9PSBgQkVQQS1kdXAxYH4gImR1cDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiZHVwMyIpKSAlPiUgCiAgZmlsdGVyKGR1cDIgIT0gImR1cDJfdW5pcXVlIikgJT4lIAogIHBpdm90X2xvbmdlcihzdGFydHNfd2l0aCgiZHVwIiksIG5hbWVzX3RvID0gImR1cCIsIHZhbHVlc190byA9ICJ2YXJpYW50X3R5cGUiKQpCRVBBX2RmCmBgYAoKYGBge3J9CiMgUmVhZCBpbiBCTEFVIGRpdmVyZ2VudCBzaXRlcyBmaWxlCkJMQVVfZGYgPC0gcmVhZF90c3YoQkxBVV9maWxlKSAlPiUgCiAgbXV0YXRlKGR1cDEgPSAiZHVwMSIsCiAgICAgICAgIGR1cDIgPSBjYXNlX3doZW4oYEJMQVUtZHVwMmAgPT0gYEJMQVUtZHVwMWB+ICJkdXAxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBgQkxBVS1kdXAyYCA9PSBgQkxBVS1kdXA0YH4gImR1cDQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGBCTEFVLWR1cDJgID09IGBCTEFVLWR1cDNgfiAiZHVwMi0zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gImR1cDJfdW5pcXVlIiksCiAgICAgICAgIGR1cDMgPSBjYXNlX3doZW4oYEJMQVUtZHVwM2AgPT0gYEJMQVUtZHVwMWB+ICJkdXAxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBgQkxBVS1kdXAzYCA9PSBgQkxBVS1kdXA0YH4gImR1cDQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGBCTEFVLWR1cDNgID09IGBCTEFVLWR1cDJgfiAiZHVwMi0zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gImR1cDNfdW5pcXVlIiksCiAgICAgICAgIGR1cDQgPSBjYXNlX3doZW4oYEJMQVUtZHVwNGAgPT0gYEJMQVUtZHVwMWB+ICJkdXAxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gImR1cDQiKSkgJT4lIAogIGZpbHRlcihkdXAyICE9ICJkdXAyX3VuaXF1ZSIsIGR1cDMgIT0gImR1cDNfdW5pcXVlIikgJT4lIAogIHBpdm90X2xvbmdlcihzdGFydHNfd2l0aCgiZHVwIiksIG5hbWVzX3RvID0gImR1cCIsIHZhbHVlc190byA9ICJ2YXJpYW50X3R5cGUiKQpCTEFVX2RmCmBgYAoKYGBge3J9CiMgUmVhZCBpbiBDTUNCIGRpdmVyZ2VudCBzaXRlcyBmaWxlCkNNQ0JfZGYgPC0gcmVhZF90c3YoQ01DQl9maWxlKSAlPiUgCiAgbXV0YXRlKGR1cDEgPSAiZHVwMSIsCiAgICAgICAgIGR1cDIgPSBjYXNlX3doZW4oYENNQ0ItZHVwMmAgPT0gYENNQ0ItZHVwMWB+ICJkdXAxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBgQ01DQi1kdXAyYCA9PSBgQ01DQi1kdXAzYH4gImR1cDMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiZHVwMl91bmlxdWUiKSwKICAgICAgICAgZHVwMyA9IGNhc2Vfd2hlbihgQ01DQi1kdXAzYCA9PSBgQ01DQi1kdXAxYH4gImR1cDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiZHVwMyIpKSAlPiUgCiAgZmlsdGVyKGR1cDIgIT0gImR1cDJfdW5pcXVlIikgJT4lIAogIHBpdm90X2xvbmdlcihzdGFydHNfd2l0aCgiZHVwIiksIG5hbWVzX3RvID0gImR1cCIsIHZhbHVlc190byA9ICJ2YXJpYW50X3R5cGUiKQpDTUNCX2RmCmBgYAoKYGBge3J9CiMgUmVhZCBpbiBETlNFIGRpdmVyZ2VudCBzaXRlcyBmaWxlCkROU0VfZGYgPC0gcmVhZF90c3YoRE5TRV9maWxlKSAlPiUgCiAgbXV0YXRlKGR1cDEgPSAiZHVwMSIsCiAgICAgICAgIGR1cDIgPSBjYXNlX3doZW4oYEROU0UtZHVwMmAgPT0gYEROU0UtZHVwMWB+ICJkdXAxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBgRE5TRS1kdXAyYCA9PSBgRE5TRS1kdXAzYH4gImR1cDMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiZHVwMl91bmlxdWUiKSwKICAgICAgICAgZHVwMyA9IGNhc2Vfd2hlbihgRE5TRS1kdXAzYCA9PSBgRE5TRS1kdXAxYH4gImR1cDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiZHVwMyIpKSAlPiUgCiAgZmlsdGVyKGR1cDIgIT0gImR1cDJfdW5pcXVlIikgJT4lIAogIHBpdm90X2xvbmdlcihzdGFydHNfd2l0aCgiZHVwIiksIG5hbWVzX3RvID0gImR1cCIsIHZhbHVlc190byA9ICJ2YXJpYW50X3R5cGUiKQpETlNFX2RmCmBgYAoKYGBge3J9CiMgUmVhZCBpbiBFQ0hPIGRpdmVyZ2VudCBzaXRlcyBmaWxlCkVDSE9fZGYgPC0gcmVhZF90c3YoRUNIT19maWxlKSAlPiUgCiAgbXV0YXRlKGR1cDEgPSAiZHVwMSIsCiAgICAgICAgIGR1cDIgPSBjYXNlX3doZW4oYEVDSE8tZHVwMmAgPT0gYEVDSE8tZHVwMWB+ICJkdXAxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBgRUNITy1kdXAyYCA9PSBgRUNITy1kdXAzYH4gImR1cDMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiZHVwMl91bmlxdWUiKSwKICAgICAgICAgZHVwMyA9IGNhc2Vfd2hlbihgRUNITy1kdXAzYCA9PSBgRUNITy1kdXAxYH4gImR1cDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiZHVwMyIpKSAlPiUgCiAgZmlsdGVyKGR1cDIgIT0gImR1cDJfdW5pcXVlIikgJT4lIAogIHBpdm90X2xvbmdlcihzdGFydHNfd2l0aCgiZHVwIiksIG5hbWVzX3RvID0gImR1cCIsIHZhbHVlc190byA9ICJ2YXJpYW50X3R5cGUiKQpFQ0hPX2RmCmBgYAoKYGBge3J9CiMgUmVhZCBpbiBKQURFIGRpdmVyZ2VudCBzaXRlcyBmaWxlCkpBREVfZGYgPC0gcmVhZF90c3YoSkFERV9maWxlKSAlPiUgCiAgbXV0YXRlKGR1cDEgPSAiZHVwMSIsCiAgICAgICAgIGR1cDIgPSBjYXNlX3doZW4oYEpBREUtZHVwMmAgPT0gYEpBREUtZHVwMWB+ICJkdXAxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBgSkFERS1kdXAyYCA9PSBgSkFERS1kdXAzYH4gImR1cDMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiZHVwMl91bmlxdWUiKSwKICAgICAgICAgZHVwMyA9IGNhc2Vfd2hlbihgSkFERS1kdXAzYCA9PSBgSkFERS1kdXAxYH4gImR1cDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiZHVwMyIpKSAlPiUgCiAgZmlsdGVyKGR1cDIgIT0gImR1cDJfdW5pcXVlIikgJT4lIAogIHBpdm90X2xvbmdlcihzdGFydHNfd2l0aCgiZHVwIiksIG5hbWVzX3RvID0gImR1cCIsIHZhbHVlc190byA9ICJ2YXJpYW50X3R5cGUiKQpKQURFX2RmCmBgYAoKYGBge3J9CiMgUmVhZCBpbiBLRlNZIGRpdmVyZ2VudCBzaXRlcyBmaWxlCktGU1lfZGYgPC0gcmVhZF90c3YoS0ZTWV9maWxlKSAlPiUgCiAgbXV0YXRlKGR1cDEgPSAiZHVwMSIsCiAgICAgICAgIGR1cDIgPSBjYXNlX3doZW4oYEtGU1ktZHVwMmAgPT0gYEtGU1ktZHVwMWB+ICJkdXAxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBgS0ZTWS1kdXAyYCA9PSBgS0ZTWS1kdXAzYH4gImR1cDMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiZHVwMl91bmlxdWUiKSwKICAgICAgICAgZHVwMyA9IGNhc2Vfd2hlbihgS0ZTWS1kdXAzYCA9PSBgS0ZTWS1kdXAxYH4gImR1cDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiZHVwMyIpKSAlPiUgCiAgZmlsdGVyKGR1cDIgIT0gImR1cDJfdW5pcXVlIikgJT4lIAogIHBpdm90X2xvbmdlcihzdGFydHNfd2l0aCgiZHVwIiksIG5hbWVzX3RvID0gImR1cCIsIHZhbHVlc190byA9ICJ2YXJpYW50X3R5cGUiKQpLRlNZX2RmCmBgYAoKYGBge3J9CiMgTWFrZSBmdW5jdGlvbiB0byBnZW5lcmF0ZSBoZWF0bWFwIHBsb3QKZGl2X3Bvc19wbG90MyA8LSBmdW5jdGlvbihkZil7CiAgcDwtIGRmICU+JQogICAgZ2dwbG90KGFlcyh4ID0gZmFjdG9yKFBvc2l0aW9uKSwgeSA9IHJlb3JkZXIoZHVwLCBkZXNjKGR1cCkpLCBmaWxsID0gdmFyaWFudF90eXBlKSkgKwogICAgZ2VvbV90aWxlKGNvbG9yPSJ3aGl0ZSIpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiMwMDY3NGIiLCAiIzAwZDM5OSIpKSArIAogICAgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJ0b3AiKSArCiAgICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDcpICsKICAgIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpLAogICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDAsIDAsIDAsIDApLAogICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIgogICkKICByZXR1cm4ocCkKfQpgYGAKCmBgYHtyfQojIE1ha2UgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgaGVhdG1hcCBwbG90IHdoZW4gdGhlcmUgYXJlIDQgZHVwbGljYXRpb24gY29waWVzCmRpdl9wb3NfcGxvdDQgPC0gZnVuY3Rpb24oZGYpewogIHA8LSBkZiAlPiUKICAgIGdncGxvdChhZXMoeCA9IGZhY3RvcihQb3NpdGlvbiksIHkgPSByZW9yZGVyKGR1cCwgZGVzYyhkdXApKSwgZmlsbCA9IHZhcmlhbnRfdHlwZSkpICsKICAgIGdlb21fdGlsZShjb2xvcj0id2hpdGUiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDA2NzRiIiwgIiMwMGQzOTkiLCJncmV5IikpICsgCiAgICBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gInRvcCIpICsKICAgIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gNykgKwogICAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAwLCB2anVzdCA9IDAuNSksCiAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMCwgMCwgMCwgMCksCiAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiCiAgKQogIHJldHVybihwKQp9CmBgYAoKYGBge3IgZmlnLmhlaWdodD0xLCBmaWcud2lkdGg9MTB9CiMgTWFrZSBCRVBBIHBsb3QKQkVQQV9wbG90IDwtIGRpdl9wb3NfcGxvdDMoQkVQQV9kZikgKyB5bGFiKCJCRVBBIikKQkVQQV9wbG90CmBgYAoKYGBge3IgZmlnLmhlaWdodD0xLCBmaWcud2lkdGg9MTB9CiMgTWFrZSBDTUNCIHBsb3QKQ01DQl9wbG90IDwtIGRpdl9wb3NfcGxvdDMoQ01DQl9kZikgKyB5bGFiKCJDTUNCIikKQ01DQl9wbG90CmBgYAoKYGBge3IgZmlnLmhlaWdodD0xLCBmaWcud2lkdGg9MTB9CiMgTWFrZSBETlNFIHBsb3QKRE5TRV9wbG90IDwtIGRpdl9wb3NfcGxvdDMoRE5TRV9kZikgKyB5bGFiKCJETlNFIikKRE5TRV9wbG90CmBgYAoKCmBgYHtyIGZpZy5oZWlnaHQ9MSwgZmlnLndpZHRoPTEwfQpFQ0hPX3Bsb3QgPC0gZGl2X3Bvc19wbG90MyhFQ0hPX2RmKSArIHlsYWIoIkVDSE8iKQpFQ0hPX3Bsb3QKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTEsIGZpZy53aWR0aD0xMH0KIyBNYWtlIEpBREUgcGxvdApKQURFX3Bsb3QgPC0gZGl2X3Bvc19wbG90MyhKQURFX2RmKSArIHlsYWIoIkpBREUiKQpKQURFX3Bsb3QKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTEsIGZpZy53aWR0aD0xMH0KIyBNYWtlIEtGU1kgcGxvdApLRlNZX3Bsb3QgPC0gZGl2X3Bvc19wbG90MyhLRlNZX2RmKSArIHlsYWIoIktGU1kiKQpLRlNZX3Bsb3QKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTEsIGZpZy53aWR0aD0xMH0KIyBNYWtlIEJMQVUgcGxvdApCTEFVX3Bsb3QgPC0gZGl2X3Bvc19wbG90NChCTEFVX2RmKSArIHlsYWIoIkJMQVUiKQpCTEFVX3Bsb3QKYGBgCgpgYGB7cn0KcGxvdF9ncmlkKEJFUEFfcGxvdCwgRUNIT19wbG90LCBKQURFX3Bsb3QsIENNQ0JfcGxvdCwgRE5TRV9wbG90LCBLRlNZX3Bsb3QsIEJMQVVfcGxvdCwgbmNvbCA9IDEpCmBgYAoKYGBge3J9CnBsb3RfZ3JpZChCRVBBX3Bsb3QsIEVDSE9fcGxvdCwgQ01DQl9wbG90LCBCTEFVX3Bsb3QsIG5jb2wgPSAxKQpgYGAKCiMjIEFuYWx5c2lzIHVzaW5nIHNhbWUgcG9zaXRpb24gbnVtYmVycyBmb3IgYWxsIGFsaWdubWVudHMKYGBge3J9CmFsbF9maWxlIDwtICIvVm9sdW1lcy9sYWJfa2luZ3NsZXkvYW1iZW5qL215b3Npbl9kdXBzL2FuYWx5c2lzL25haHJfYW5hbHlzaXMvNS02LWNvcHlfZHVwX2RpdmVyZ2VudF9zaXRlcy50eHQiCmFsbF9ub2dhcHNfZmlsZSA8LSAiL1ZvbHVtZXMvbGFiX2tpbmdzbGV5L2FtYmVuai9teW9zaW5fZHVwcy9hbmFseXNpcy9uYWhyX2FuYWx5c2lzLzUtNi1jb3B5X2R1cF9ub2dhcHNfZGl2ZXJnZW50X3NpdGVzLnR4dCIKYGBgCgpgYGB7cn0KIyBSZWFkIGluIEJMQVUgZGl2ZXJnZW50IHNpdGVzIGZpbGUKYWxsX25vZ2Fwc19kZiA8LSByZWFkX3RzdihhbGxfbm9nYXBzX2ZpbGUpICU+JSAKICAgIHBpdm90X2xvbmdlcihjb2xzID0gLVBvc2l0aW9uLCBuYW1lc190byA9IGMoInNhbXBsZSIsICJkdXAiKSxuYW1lc19zZXAgPSAiLSIpICU+JSAKICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBkdXAsIHZhbHVlc19mcm9tID0gdmFsdWUpICU+JSAKICBtdXRhdGUoZHVwMV90eXBlID0gY2FzZV93aGVuKCFpcy5uYShkdXAxKSB+ICJkdXAxIiksCiAgICAgICAgIGR1cDJfdHlwZSA9IGNhc2Vfd2hlbihkdXAyID09IGR1cDEgfiAiZHVwMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUgIT0gIkJMQVUiICYgZHVwMiA9PSBkdXAzIH4gImR1cEwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZSA9PSAiQkxBVSIgJiBkdXAyID09IGR1cDQgfiAiZHVwTCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUgPT0gIkJMQVUiICYgZHVwMiA9PSBkdXAzIH4gIm90aGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKGR1cDIpIH4gIm90aGVyIiksCiAgICAgICAgIGR1cDNfdHlwZSA9IGNhc2Vfd2hlbihkdXAzID09IGR1cDEgfiAiZHVwMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXAzID09IGR1cDQgfiAiZHVwTCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGUgPT0gIkJMQVUiICYgZHVwMyA9PSBkdXAyIH4gIm90aGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpcy5uYShkdXAzKSB+ICJkdXBMIiksCiAgICAgICAgIGR1cDRfdHlwZSA9IGNhc2Vfd2hlbihkdXA0ID09IGR1cDEgfiAiZHVwMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXMubmEoZHVwNCkgfiAiZHVwTCIpKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKGVuZHNfd2l0aCgidHlwZSIpLCBuYW1lc190byA9ICJkdXAiLCB2YWx1ZXNfdG8gPSAidmFyaWFudF90eXBlIikgJT4lIAogIG11dGF0ZShkdXAgPSBzdHJfcmVtb3ZlKGR1cCwgIl90eXBlIiksCiAgICAgICAgIHNhbXBsZSA9IGZhY3RvcihzYW1wbGUsIGxldmVscyA9IGMoIkJFUEEiLCAiRUNITyIsICJKQURFIiwgIkNNQ0IiLCAiRE5TRSIsICJLRlNZIiwgIkJMQVUiKSkpICU+JSAKICBmaWx0ZXIoIWlzLm5hKHZhcmlhbnRfdHlwZSksICEoc2FtcGxlID09ICJCTEFVIiAmIGR1cDE9PWR1cDIgJiBkdXAxPT1kdXAzICYgZHVwMT09ZHVwNCksICEoc2FtcGxlICE9ICJCTEFVIiAmIGR1cDE9PWR1cDIgJiBkdXAxPT1kdXAzKSkKYGBgCmBgYHtyfQojIE1ha2UgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgaGVhdG1hcCBwbG90IHdoZW4gdGhlcmUgYXJlIDQgZHVwbGljYXRpb24gY29waWVzCmRpdl9wb3NfcGxvdF9hbGwgPC0gZnVuY3Rpb24oZGYpewogIHA8LSBkZiAlPiUKICAgIGdncGxvdChhZXMoeCA9IGZhY3RvcihQb3NpdGlvbiksIHkgPSByZW9yZGVyKGR1cCwgZGVzYyhkdXApKSwgZmlsbCA9IHZhcmlhbnRfdHlwZSkpICsKICAgIGdlb21fdGlsZShjb2xvcj0id2hpdGUiKSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDA2NzRiIiwgIiMwMGQzOTkiLCJncmV5IikpICsgCiAgICBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gInRvcCIpICsKICAgIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gNi41KSArCiAgICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDAsIHZqdXN0ID0gMC41KSwKICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigwLCAwLCAwLCAwKSwKICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIKICApCiAgcmV0dXJuKHApCn0KYGBgCgpgYGB7cn0KYWxsX25vZ2Fwc19kZgpkaXZfcG9zX3Bsb3RfYWxsKGZpbHRlcihhbGxfbm9nYXBzX2RmLCAoc2FtcGxlID09ICJCTEFVIiAmIGR1cDEhPWR1cDQpfCAoc2FtcGxlICE9ICJCTEFVIiAmIGR1cDEhPWR1cDMpKSkgKyAKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKHNhbXBsZSksIHNjYWxlPSJmcmVlX3kiLCBzcGFjZT0iZnJlZV95Iiwgc3dpdGNoID0gInkiKSArCiAgdGhlbWUoc3RyaXAucGxhY2VtZW50ID0gIm91dHNpZGUiLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLnNwYWNpbmcueSA9IHVuaXQoMC4xLCAibGluZXMiKSkKYGBgCmBgYHtyfQpnZ3NhdmUoIi9Wb2x1bWVzL2xhYl9raW5nc2xleS9hbWJlbmovbXlvc2luX2R1cHMvYW5hbHlzaXMvbmFocl9hbmFseXNpcy9zaGFyZWRfcGxvdF9hbGxTYW1wc19hbGxQb3NfZmlndXJlLnBkZiIsIHdpZHRoID0gNi41LCBoZWlnaHQgPSAyLjUsIHVuaXRzID0gImluIikKYGBgCgoKYGBge3J9CiMgU2luY2UgQ01DQiwgRE5TRSwgS0ZTWSwgYW5kIEpBREUgcmVzdWx0cyBhcmUgdGhlIHNhbWUsIGZpbHRlciBkb3duIHRvIG9uZSByZXByZXNlbnRhdGl2ZQpkaXZfcG9zX3Bsb3RfYWxsKGZpbHRlcihhbGxfbm9nYXBzX2RmLCBzYW1wbGUgJWluJSBjKCJCRVBBIiwgIkVDSE8iLCAiQ01DQiIsICJCTEFVIiksIChzYW1wbGUgPT0gIkJMQVUiICYgZHVwMSE9ZHVwNCl8IChzYW1wbGUgIT0gIkJMQVUiICYgZHVwMSE9ZHVwMykpKSArIAogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoc2FtcGxlKSwgc2NhbGU9ImZyZWVfeSIsIHNwYWNlPSJmcmVlX3kiLCBzd2l0Y2ggPSAieSIpICsKICB0aGVtZShzdHJpcC5wbGFjZW1lbnQgPSAib3V0c2lkZSIsIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCmBgYHtyfQojIFBsb3QganVzdCBCRVBBIHdpdGggQkVQQS1kaXZlcmdlbnQgcG9zaXRpb25zIG9ubHksIGJ1dCBwb3NpdGlvbiBudW1iZXJzIGFyZSBjb21wYXJhYmxlIHRvIG90aGVycwpCRVBBX3NoYXJlZF9wbG90IDwtIGRpdl9wb3NfcGxvdF9hbGwoZmlsdGVyKGFsbF9ub2dhcHNfZGYsIHNhbXBsZSA9PSAiQkVQQSIsIGR1cDEhPWR1cDMpKSArIAogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoc2FtcGxlKSwgc2NhbGVzPSJmcmVlIiwgc3BhY2U9ImZyZWUiLCBzd2l0Y2ggPSAieSIpICsKICB0aGVtZShzdHJpcC5wbGFjZW1lbnQgPSAib3V0c2lkZSIsIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkKCkJFUEFfc2hhcmVkX3Bsb3QKYGBgCmBgYHtyfQojIFBsb3QganVzdCBDTUNCIHdpdGggQ01DQi1kaXZlcmdlbnQgcG9zaXRpb25zIG9ubHksIGJ1dCBwb3NpdGlvbiBudW1iZXJzIGFyZSBjb21wYXJhYmxlIHRvIG90aGVycwpDTUNCX3NoYXJlZF9wbG90IDwtIGRpdl9wb3NfcGxvdF9hbGwoZmlsdGVyKGFsbF9ub2dhcHNfZGYsIHNhbXBsZSA9PSAiQ01DQiIsIGR1cDEhPWR1cDMpKSArIAogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoc2FtcGxlKSwgc2NhbGVzPSJmcmVlIiwgc3BhY2U9ImZyZWUiLCBzd2l0Y2ggPSAieSIpICsKICB0aGVtZShzdHJpcC5wbGFjZW1lbnQgPSAib3V0c2lkZSIsIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkKCkNNQ0Jfc2hhcmVkX3Bsb3QKYGBgCmBgYHtyfQojIFBsb3QganVzdCBETlNFIHdpdGggRE5TRS1kaXZlcmdlbnQgcG9zaXRpb25zIG9ubHksIGJ1dCBwb3NpdGlvbiBudW1iZXJzIGFyZSBjb21wYXJhYmxlIHRvIG90aGVycwpETlNFX3NoYXJlZF9wbG90IDwtIGRpdl9wb3NfcGxvdF9hbGwoZmlsdGVyKGFsbF9ub2dhcHNfZGYsIHNhbXBsZSA9PSAiRE5TRSIsIGR1cDEhPWR1cDMpKSArIAogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoc2FtcGxlKSwgc2NhbGVzPSJmcmVlIiwgc3BhY2U9ImZyZWUiLCBzd2l0Y2ggPSAieSIpICsKICB0aGVtZShzdHJpcC5wbGFjZW1lbnQgPSAib3V0c2lkZSIsIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkKCkROU0Vfc2hhcmVkX3Bsb3QKYGBgCmBgYHtyfQojIFBsb3QganVzdCBFQ0hPIHdpdGggRUNITy1kaXZlcmdlbnQgcG9zaXRpb25zIG9ubHksIGJ1dCBwb3NpdGlvbiBudW1iZXJzIGFyZSBjb21wYXJhYmxlIHRvIG90aGVycwpFQ0hPX3NoYXJlZF9wbG90IDwtIGRpdl9wb3NfcGxvdF9hbGwoZmlsdGVyKGFsbF9ub2dhcHNfZGYsIHNhbXBsZSA9PSAiRUNITyIsIGR1cDEhPWR1cDMpKSArIAogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoc2FtcGxlKSwgc2NhbGVzPSJmcmVlIiwgc3BhY2U9ImZyZWUiLCBzd2l0Y2ggPSAieSIpICsKICB0aGVtZShzdHJpcC5wbGFjZW1lbnQgPSAib3V0c2lkZSIsIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkKCkVDSE9fc2hhcmVkX3Bsb3QKYGBgCmBgYHtyfQojIFBsb3QganVzdCBKQURFIHdpdGggSkFERS1kaXZlcmdlbnQgcG9zaXRpb25zIG9ubHksIGJ1dCBwb3NpdGlvbiBudW1iZXJzIGFyZSBjb21wYXJhYmxlIHRvIG90aGVycwpKQURFX3NoYXJlZF9wbG90IDwtIGRpdl9wb3NfcGxvdF9hbGwoZmlsdGVyKGFsbF9ub2dhcHNfZGYsIHNhbXBsZSA9PSAiSkFERSIsIGR1cDEhPWR1cDMpKSArIAogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoc2FtcGxlKSwgc2NhbGVzPSJmcmVlIiwgc3BhY2U9ImZyZWUiLCBzd2l0Y2ggPSAieSIpICsKICB0aGVtZShzdHJpcC5wbGFjZW1lbnQgPSAib3V0c2lkZSIsIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkKCkpBREVfc2hhcmVkX3Bsb3QKYGBgCgpgYGB7cn0KIyBQbG90IGp1c3QgS0ZTWSB3aXRoIEtGU1ktZGl2ZXJnZW50IHBvc2l0aW9ucyBvbmx5LCBidXQgcG9zaXRpb24gbnVtYmVycyBhcmUgY29tcGFyYWJsZSB0byBvdGhlcnMKS0ZTWV9zaGFyZWRfcGxvdCA8LSBkaXZfcG9zX3Bsb3RfYWxsKGZpbHRlcihhbGxfbm9nYXBzX2RmLCBzYW1wbGUgPT0gIktGU1kiLCBkdXAxIT1kdXAzKSkgKyAKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKHNhbXBsZSksIHNjYWxlcz0iZnJlZSIsIHNwYWNlPSJmcmVlIiwgc3dpdGNoID0gInkiKSArCiAgdGhlbWUoc3RyaXAucGxhY2VtZW50ID0gIm91dHNpZGUiLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpCgpLRlNZX3NoYXJlZF9wbG90CmBgYAoKYGBge3J9CiMgUGxvdCBqdXN0IEJMQVUgd2l0aCBCTEFVLWRpdmVyZ2VudCBwb3NpdGlvbnMgb25seSwgYnV0IHBvc2l0aW9uIG51bWJlcnMgYXJlIGNvbXBhcmFibGUgdG8gb3RoZXJzCkJMQVVfc2hhcmVkX3Bsb3QgPC0gZGl2X3Bvc19wbG90X2FsbChmaWx0ZXIoYWxsX25vZ2Fwc19kZiwgc2FtcGxlID09ICJCTEFVIiwgZHVwMSE9ZHVwNCkpICsgCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhzYW1wbGUpLCBzY2FsZXM9ImZyZWUiLCBzcGFjZT0iZnJlZSIsIHN3aXRjaCA9ICJ5IikgKwogIHRoZW1lKHN0cmlwLnBsYWNlbWVudCA9ICJvdXRzaWRlIiwgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKQoKQkxBVV9zaGFyZWRfcGxvdApgYGAKCmBgYHtyfQpzaGFyZWRfcGxvdF9zdWJzZXQgPC0gcGxvdF9ncmlkKEJFUEFfc2hhcmVkX3Bsb3QsIEVDSE9fc2hhcmVkX3Bsb3QsIENNQ0Jfc2hhcmVkX3Bsb3QsIEJMQVVfc2hhcmVkX3Bsb3QsIG5jb2wgPSAxKQpzaGFyZWRfcGxvdF9zdWJzZXQKYGBgCmBgYHtyfQpnZ3NhdmUoIi9Wb2x1bWVzL2xhYl9raW5nc2xleS9hbWJlbmovbXlvc2luX2R1cHMvYW5hbHlzaXMvbmFocl9hbmFseXNpcy9zaGFyZWRfcGxvdF9zdWJzZXRfZmlndXJlLnBkZiIsIHdpZHRoID0gNi41LCBoZWlnaHQgPSAyLjIsIHVuaXRzID0gImluIikKYGBgCgo=